<?php
// ### AclAssistant : Community

class Handler_PersonForm extends RL_Handler
{
	var $ui_view_form = 'person:create';
	var $ui_view_not_found = 'person:create';
	var $ui_view_error = 'person:create';
	var $ui_view_success = 'person:create';

	var $rq_for = 'for';

	protected function init()
	{
		parent::init();

		$this->acl_assistant = $this->module->aa;
		$this->acl_data = $this->acl_assistant->getInfo();
		$this->acl_assistant->getAvailableOperations();

		$this->m_person = $this->ctx->mm->getModel('Person', 'm');
	}

	public function process ()
	{
		do {
			$this->person_obj = $this->loadPerson();

			if (!$this->person_obj) {
				$view = $this->rh->views->findByName($this->ui_view_not_found);
				$view->data = $this->acl_assistant->template_data;
				debug(__METHOD__. ' not found');
				//- не загружены данные
				return false;
				break;
			}

			// инициализировать форму
			$form_data = $this->getFormData();
			$form = $this->buildForm($form_data);

			$result = $form->Handle();

			if ($result !== false) {
				$view = $this->rh->views->findByName($this->ui_view_form);
				$view->data = $this->acl_assistant->template_data;
				$view->data['form'] = $result;
				debug(__METHOD__. ' form');
				//- нарисовать форму
				break;
			}

			// обработаем данные из формы
			$person_obj = $this->person_obj;
			foreach ($form->hash as $field_name=>$model) {

				if (get_class($model->model) == "FormComponent_model_upload") {

					if ($this->rh->FILES['_'.$field_name]['tmp_name']) {
						// Тут создается объект ImageStorage, который и сохранит картинку нужным образом
						$this->rh->UseClass('stores_ImageStorage');
						$img_store = new ImageStorage( $this->ctx->store );

						$thumbs['orig']['filter'] = 'scale';
						$thumbs['orig'][ 'max_w'] = 100;
						$thumbs['orig'][ 'max_h'] = 100;

						$image_oid = $img_store->Put( $this->rh->FILES['_'.$field_name]['tmp_name'], $thumbs );

						$person_obj->data[ $field_name ] = $image_oid;
					}
				} else {
					$person_obj->data[ $field_name ] = $model->model->model_data;
				}

			}

			if (!$this->m_person->putPerson( $person_obj )) {
				$view = $this->rh->views->findByName($this->ui_view_failed);
				$view->data = $this->acl_assistant->template_data;
				debug(__METHOD__. ' failed');
				//- ошибка при изменении данных
				break;
			}

			// данные сохранены
			debug(__METHOD__. ' success');
			if ($for = $this->getForItemParams()) {
				$this->redirectToItemEdit('Обновите список авторов', current($for));
			}
			//$view = $this->rh->views->findByName($this->ui_view_success);
			//$view->data = $this->acl_assistant->template_data;
			$this->redirectToPerson('Данные сохранены', $person_obj);
		} while (false);

		$this->rh->response->setContent( $view );
	} // end of function execute


	public function loadPerson ()
	{
		$person = NULL;
		if (isset($this->params['oid'])) {
			$person_oid = $this->params['oid'];
			$person = $this->m_person->getPerson($person_oid);

			$this->acl_assistant->getAvailableOperations($person->id);
			if	(!$this->acl_assistant->is_granted(array('item_edit'))) {
				$person = false;
			}
			// HACK : 2008-06-25 : lucky
			// fix #657
			// не отдавать объект для редактирования, если это не персона в текущем сообществе.
			if (!isset($person->data['community_oid'])
				|| $person->data['community_oid'] != $this->acl_assistant->acl_data['comity_oid']
				|| $person->type != 'fperson'
				) {
				$person = false;
			}
		} else {
			$community_oid = $this->acl_assistant->acl_data['comity_oid'];
			$person = $this->m_person->createPerson($community_oid, array());
		}
		return $person;
	} // end of method loadPerson

	public function buildForm ($form_data)
	{
		$rh = $this->rh;
		$rh->UseClass("Form_Form");

		// создаст объекты форм для каждого раздела и положит в массив $this->forms, на входе массив с разделами
		$form = new Form( $this->rh,
			array(
				"auto_user_id"  => 0,
				"template_form"	=> "form:Form",
				"template_buttonlist" => "form:Buttons",
				"db_table" => "userinfo", // это id формы
			), substr($this->rh->SERVER['URL'], strlen($this->rh->base_url)),
			NULL // дефолтные шаблонные переменные, если таковые есть в шаблонах
		);

		$form->AddField( "fullname", array(
			// параметры бд
			"db_name" => "fullname",
			"db_size" => 40,
			"model_default" => $form_data['fullname'],
			// параметры рендеринга форм
			"wrapper_tpl"      => "wrapper:TextWrapper", // обертка вокруг поля при создании итема
			"interface_tpl"    => "string:Plain", // само поле
			"wrapper_title"    => "Имя",
			"wrapper_desc"     => "Максимум 40 символов",
			'validator'        => 'validator_string',
			"validator_params" => array("not_empty"=>1, 'max' => 40),
		) );

		$form->AddField( "description", array(
			// параметры бд
			"db_name" => "description",
			"model_default" => isset($form_data['description']) ? $form_data['description'] : '',
			// параметры рендеринга форм
			"wrapper_tpl"          => "wrapper:TextAreaWrapper", // обертка вокруг поля при создании итема
			"interface_tpl"        => "string:Tinymce",
			"interface_tpl_params" => array ('tiny_mce_layout' => 'light'),
			"wrapper_title"        => "Пара слов о персоне",
			//"wrapper_desc"         => "Несколько слов о работе, достижениях, интересах",
			"validator_params"     => array("not_empty"=>0, ),
		));

		$form->AddField( "avatar", array(
			"db_name"       => "avatar",
			"model"         => "model_upload",
			"model_default" => isset($form_data['avatar']) ? $form_data['avatar'] : '',
			"wrapper_tpl"   => "wrapper:FileWrapper",
			"interface_tpl" => "upload:UploadImage",
			"wrapper_title" => "Аватар",
			"wrapper_desc"  => "Картинка в формате jpg, gif или png. Рекомендуемый размер 100x100 пикселей",

			"validator" => "validator_upload",
			"validator_params" => array(
				"maxsize"=>2048*1000,
				"fileext"=>array('gif', 'png', 'jpg', 'jpe', 'jpeg'),
			),
		));
		$form->AddField( "openid_url", array(
			// параметры бд
			"db_name" => "openid_url",
			"db_type" => "string",
			"db_size" => 255,

			"model_default" => isset($form_data['openid_url']) ? $form_data['openid_url'] : '',
			// параметры рендеринга форм
			"wrapper_tpl" => "wrapper:TextWrapper", // обертка вокруг поля при создании итема
			"interface_tpl" => "string:Plain", // само поле
			"wrapper_title" => "OpenID пользователя данной персоны (URL)",
			"wrapper_desc" => "Максимум 255 символов",
			"validator" => "validator_string",
			"validator_params"=> array(	"not_empty"=>0, "is_regexp"=>"/^[^а-бА-Б ]+$/" ), // more complex check: /^((http|ftp):\/)?\/?([^:\/\s]+)((\/\w+)*\/)([\w\-\.]+\.[^#?\s]+)(#[\w\-]+)?$/

			"external_postprocessing" => 1,
			"external_postprocessing_type" => "url",
		));

		// у каждой формы две кнопки
		$form->AddButton( array(
			"event" => FORM_EVENT_OK,
			"title" => "Okay",
			"template" => "Submit",
		));

		return $form;
	} // end of method buildForm

	public function getFormData ()
	{
		$data = $this->person_obj->data;
		$data = array_merge($data, $this->ctx->rh->GET);
		return $data;
	} // end of method getFormData

	public function getForItemParams ()
	{
		$res = NULL;
		$GET = $this->ctx->rh->GET;
		if (isset($GET[$this->rq_for])) {
			$params = $GET[$this->rq_for];
			if (!is_array($params)) $params = array($params);
			$res = $params;
		}
		return $res;
	} // end of method getDoctypeFilterParams

	public function redirectToPerson ($msg='', $o_item)
	{
		if ($msg) {
			$this->rh->setMessage($msg);
		}
		// для проголосовавших редирект на страницу итема
		$this->rh->UseClass('RL_URLGenerator');
		$ug = new RL_URLGenerator($this->rh->router->getRule('person_show'));
		$ug->setRouter($this->rh->router);
		$ug->setParams(array(
		'community_url' => $this->params['community_url'],
		'oid' => $o_item->id,
		));
		$url = $ug->generateUrl();
		if ($url) {
			$this->rh->redirect($url);
		} else {
			$this->rh->response->setContent( "Wazzup?!" );
		}
	} // end of method redirectToPerson

	public function redirectToItemEdit ($msg='', $item_oid)
	{
		if ($msg) {
			$this->rh->setMessage($msg);
		}
		// для проголосовавших редирект на страницу итема
		$this->rh->UseClass('RL_URLGenerator');
		$ug = new RL_URLGenerator($this->rh->router->getRule('edititem'));
		$ug->setRouter($this->rh->router);
		$ug->setParams(array(
		'community_url' => $this->params['community_url'],
		'id_item' => $item_oid,
		));
		$url = $ug->generateUrl();
		if ($url) {
			$this->rh->redirect($url);
		} else {
			$this->rh->response->setContent( "Wazzup?!" );
		}
	} // end of method redirectToPerson
}
